#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <algorithm>

using namespace std;



class Solution1
{
public:
    const string nums[10] = { "0", "0", "ABC", "DEF", "GHI", "JKL", "MNO", "PQRS", "TUV", "WXYZ" };

    void solve()
    {
        int mp[126] = { 0 };
        for (int i = 2; i <= 9; ++i)
        {
            for (char c : nums[i]) mp[c] = i + '0';
        }
        int n;
        while (cin >> n)
        {
            getchar();
            set<string> st;
            while (n--)
            {
                string str;
                getline(cin, str);
                string res;
                for (char c : str)
                {
                    if (c == '-') continue;
                    if (c >= 'A' && c <= 'Z') res += mp[c];
                    else res += c;
                    if (res.size() == 3) res += '-';
                }
                st.insert(res);
            }
            for (const string& s : st)
                cout << s << endl;
            cout << endl;
        }
    }
};

class Solution2 {
public:
    int minOperations(vector<int>& nums) {
        int n = nums.size();
        sort(nums.begin(), nums.end());
        int m = unique(nums.begin(), nums.end()) - nums.begin();
        int ans = 0, j = 0;
        for (int i = 0; i < m; ++i)
        {
            int l = i, r = m;
            while (l < r)
            {
                int m = (l + r) / 2;
                if (nums[m] > nums[i] + n - 1) r = m;
                else l = m + 1;
            }
            j = l;
            ans = max(ans, j - i);
        }
        return n - ans;
    }
};

const int MOD = 1e9 + 7;
int mem[101][101][101 << 1];

int dfs(int n, int m, int cur)
{
    if (n < 0 || m < 0 || cur < 0 || cur > 101 || (!m && (n || cur))) return 0;
    if (mem[n][m][cur] != -1) return mem[n][m][cur];

    return mem[n][m][cur] = (dfs(n - 1, m, 2 * cur) + dfs(n, m - 1, cur - 1)) % MOD;
}

int main()
{
    int n, m;
    cin >> n >> m;
    memset(mem, -1, sizeof(mem));
    mem[0][1][1] = 1;
    cout << dfs(n, m, 2);
    return 0;
}